﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using VentaElectrodomesticos.GUI.Base;
using VentaElectrodomesticos.Negocio;
using VentaElectrodomesticos.Datos;
using VentaElectrodomesticos.Contrato;
using VentaElectrodomesticos.GUI.AbmProducto;
using VentaElectrodomesticos.GUI.Helpers;
using VentaElectrodomesticos.GUI.AbmEmpleado;

namespace VentaElectrodomesticos.AsignacionStock
{
    public partial class FormAsignacionStock : BaseEdicion<StockNegocio, StockDAO, Stock>
    {
        private static FormAsignacionStock instance;
        ProductoNegocio productoNegocio;
        SucursalNegocio sucursalNegocio;
        EmpleadoNegocio empleadoNegocio;

        Producto producto;
        Empleado empleado;

        public FormAsignacionStock()
        {
            InitializeComponent();
        }

        protected override void initialize()
        {
            this.Entity = new Stock();

            this.productoNegocio = new ProductoNegocio();
            this.sucursalNegocio = new SucursalNegocio();
            this.empleadoNegocio = new EmpleadoNegocio();
            
            
            this.textAuditor.ReadOnly = true;
            this.textProducto.ReadOnly = true;
            this.cbSucursal.DataSource = this.sucursalNegocio.getAll();
            this.cbSucursal.SelectedIndexChanged += new EventHandler(cb_SelectedIndexChanged);

            this.tbStock.ReadOnly = true;
            this.cbSucursal.SelectedIndex = 0;
            this.cbSucursal.DisplayMember = "Direccion";
            this.cbSucursal.ValueMember = "Id";
        }
        

        private void loadStock()
        {
            if (this.producto != null && cbSucursal.SelectedValue != null)
            {
                this.Entity.Producto_Id = (int)this.producto.Id;
                this.Entity.Sucursal_Id = Convert.ToInt32(cbSucursal.SelectedValue);
                int? stock = this.Negocio.getLastStock(this.Entity.Producto_Id, this.Entity.Sucursal_Id);
                tbStock.Text = stock.ToString();
            }
            else {
                tbStock.Text = "--";
            }
             
        }

        protected override void getValues()
        {
            this.Entity.Producto_Id = (int)this.producto.Id;
            this.Entity.Sucursal_Id = Convert.ToInt32(cbSucursal.SelectedValue);
            this.Entity.Empleado_Id = (int)this.empleado.Id;
            if (tbStock.Text != String.Empty)
                this.Entity.Cantidad = Convert.ToInt32(tbStockEntrante.Text);
            this.Entity.Fecha = DateTime.Now.ToString(Config.regionTimeFormat);
        }

        private void cb_SelectedIndexChanged(object sender, EventArgs e)
        {
            this.loadStock();
        }

        protected override void cumpleValidaciones()
        {
            if (!RegCondition.Condition(tbStockEntrante, RegCondition.RegularExpressions.Numeric, 0, 99999))
            {
                this.Errores.Add("El stock ingresado no es válido");
            }
            else {
                if ((Convert.ToInt32(tbStockEntrante.Text)) < 1)
                    this.Errores.Add("El stock ingresado debe ser mayor a 0");
            }

            if (this.empleado == null)
            {
                this.Errores.Add("Debe seleccionar un auditor");
            }

            if (this.cbSucursal.SelectedItem == null)
            {
                this.Errores.Add("Debe seleccionar un auditor");
            }

            if (this.producto == null)
            {
                this.Errores.Add("Debe seleccionar un producto");
            }
        }


        protected override void OnClosing(CancelEventArgs e)
        {
            instance = null;
            base.OnClosing(e);
        }

        internal static FormAsignacionStock getInstance()
        {
            if (instance == null)
                instance = new FormAsignacionStock();
            instance.BringToFront();
            return instance;
        }

        private void buttonSeleccionarProducto_Click(object sender, EventArgs e)
        {
            this.searchProducto();
        }

        private void searchProducto()
        {
            FormAbmProducto formProducto = new FormAbmProducto();
            DialogResult result = GUIHelper.showFormSearch<FormAbmProducto>(formProducto);
            if (result == DialogResult.OK)
            {
                this.textProducto.Text = formProducto.Entity.Nombre + " " + formProducto.Entity.Marca;
                this.producto = formProducto.Entity;
            }

            loadStock();
        }

        private void buttonBuscarAuditor_Click(object sender, EventArgs e)
        {
            this.searchEmpleado();
        }

        private void searchEmpleado()
        {
            FormAbmEmpleado formEmpleado = new FormAbmAuditores();
            DialogResult result = GUIHelper.showFormSearch<FormAbmEmpleado>(formEmpleado);
            if (result == DialogResult.OK)
            {
                this.textAuditor.Text = formEmpleado.Entity.Nombre + " " + formEmpleado.Entity.Apellido;
                this.empleado = formEmpleado.Entity;
            }
        }

        private class FormAbmAuditores : FormAbmEmpleado {

            protected override void initialize()
            {
                base.initialize();
                base.hideTipoFilter();
            }

            protected override List<Empleado> getObjectList()
            {
                return this.getFilteredObjectList(new Empleado());
            }

            protected override List<Empleado> getFilteredObjectList(Empleado filter)
            {
                filter.inactivo = false;
                filter.Tipo_Id = 2;
                return base.getFilteredObjectList(filter);
            }
        }
    }
}
